﻿#pragma once
//#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//#include <stdlib.h>
//#include <assert.h>
//#include <string.h>
#include "common.h"

typedef int single_node_type;

typedef struct SingleListNode {
    single_node_type data;
    struct SingleNode* next;
} single_node;

extern single_node* create_single_node(single_node_type n); // 创建单向链表节点
extern void printf_single_list(single_node* head); // 打印单向链表
extern void add_head_single_node(single_node** head,
    single_node_type n);  // 头插法插入单向链表节点
extern void del_head_single_node(single_node** head); // 删除头节点
extern void add_end_single_node(single_node** head,
    single_node_type n); // 尾插法插入单向链表节点
extern void del_end_single_node(single_node** head); // 删除尾节点
extern size_t get_single_list_len(single_node* head); // 获取单向链表长度
extern void insert_single_node(single_node** head,
    size_t index, single_node_type n); // 插入指定位置的节点
extern void del_single_node(single_node** head, size_t index); // 删除指定位置的节点
extern int del_num_single_list(single_node** head, single_node_type num);// 删除指定数值的节点
extern void reverse_single_list1(single_node** head); // 翻转单向链表，迭代法
extern single_node* reverse_single_list2(single_node* head); // 翻转单向链表，递归法
extern int search_num_single_list(single_node* head,
    single_node_type num); // 查找单向链表中是否存在指定数值
extern single_node* li1_add_li2(single_node* head1, single_node* head2); // 两个单向链表相加
extern void bubble_sort_singly_linke(single_node* head); // 排序单向链表
extern void destroy_single_list(single_node* head); // 销毁单向链表